Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Windows Service event handling(?)

Îåêßíçóå áðü ôï ìÝëïò mukumuku. Τελευταία δημοσίευση από το μέλος Τάσκος Γιώργος στις 15-09-2009, 14:57. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  03-09-2009, 13:32 53453

    Windows Service event handling(?)

    Γεια χαρά,

    Έχω το εξής πρόβλημα. Έχω φτιάξει μια εφαρμογή σε windows form μορφή και δουλεύει μια χαρά. Την έφτιαξα αρχικά έτσι για ευκολότερο debugging. Μετά πήρα τον κώδικα όπως ήταν και μετέτρεψα την εφαρμογή σε windows service. Η εφαρμογή είναι στην ουσία ένας server για δικτυακή επικοινωνία ενός συγκεκριμένου πρωτόκολλου. Όσο ήταν windows form είχε μέσα στην Load της φόρμας μια γραμμή Server.Listen(). Αυτή την γραμμή την έβαλα μέσα στην onStart του windows service. Το πρόβλημα είναι ότι δεν μου λειτουργεί πλέον.

    Κρατάω logs, για exceptions και για connections. Όταν ένας client πάει να συνδεθεί τότε γίνεται triggered ένα event και ξεκινάει η λειτουργία της εφαρμογής. Αν έπιανε το event τότε θα μου έγραφε στο connection log, κάτι το οποίο δεν γίνεται. Που σημαίνει ότι δεν πιάνει το event. O client στη συγκεκριμένη περίπτωση που το δοκιμάζω είναι μια windows forms εφαρμογή που τρέχει τοπικά στο pc μου. Με την ίδια εφαρμογή το δοκίμαζα και όσο ήταν σε windows forms μορφή και λειτουργούσε σωστά. Ούτε κάποιο exception "πετάγεται". Επίσης ούτε στο event log των windows δείχνει κάποιο error.

    Είναι η πρώτη φορά που φτιάχνω windows service εφαρμογή και δεν ξέρω τι μπορεί να φταίει. Γίνεται κάτι διαφορετικό στο event handling στα windows services? Είναι κάτι άλλο? Δεν ξέρω τι να κοιτάξω πραγματικά. Ο server τρέχει κανονικά και "ακούει" απλά οι clients δεν μπορούν να συνδεθούν στην συγκεκριμένη πόρτα. Δοκίμασα κι άλλη πόρτα  μήπως δεν του άρεσε αυτή ως windows service αλλά τίποτα.

    Σημείωση : Επαλήθευσα ότι ο Server "ακούει" ανοίγωντας την windows form μορφή της εφαρμογής μου όσο το service έτρεχε. Πετούσε exception στην Form.Load στη γραμμή Server.Listen() ότι η διεύθυνση δικτύου χρησιμοποιείται. Οπότε αποκλείω το ενδεχόμενο για κάποιο λόγο να μην "ακούει" ο Server.
  •  03-09-2009, 15:06 53458 σε απάντηση της 53453

    Απ: Windows Service event handling(?)

    mukumuku:

    ...Όταν ένας client πάει να συνδεθεί τότε γίνεται triggered ένα event και ξεκινάει η λειτουργία της εφαρμογής. Αν έπιανε το event τότε θα μου έγραφε στο connection log, κάτι το οποίο δεν γίνεται. Που σημαίνει ότι δεν πιάνει το event....


    Για ποιο event μιλάς εδώ? Μπορείς να δείξεις πως το κάνεις handling?

    Δεν υπάρχουν "events" από όσο ξέρω σε ένα windows service, κάνεις ovveride κάποιες μεθόδους από:

    System.ServiceProcess.ServiceBase.

    OnStart Indicate what actions should be taken when your service starts running. You must write code in this procedure for your service to perform useful work.
    OnPause Indicate what should happen when your service is paused.
    OnStop Indicate what should happen when your service stops running.
    OnContinue Indicate what should happen when your service resumes normal functioning after being paused.
    OnShutDown Indicate what should happen just prior to your system shutting down, if your service is running at that time.
    OnCustomCommand Indicate what should happen when your service receives a custom command. For more information on custom commands, see MSDN online.
    OnPowerEvent Indicate how the service should respond when a power management event is received, such as a low battery or suspended operation.
    Run  The main entry point for the service, u sally in the Main method

    [src:MSDN]

    Θα μπορούσα να υποθέσω πολλά και διάφορα...αλλά θέλουμε κι άλλες πληροφορίες.
    Όπως, τι κάνεις στην Server.Listen()? Ποιος είναι ο σκοπός σου γενικά? Ακούς σε κάποια TCP Port? Ποια?

    Γενικά πάλι η γνώμη μου θα ήταν αν ξαναέκανες κάτι τέτοιο και για "εύκολο" debugging όπως λές, να το κάνεις σε Console App.


  •  03-09-2009, 16:07 53459 σε απάντηση της 53458

    Απ: Windows Service event handling(?)

    Λοιπόν, καταρχήν χρησιμοποιώ ένα sdk για dicom πρωτόκολλο (ιατρική εικόνα). Ίσως να μην το έθεσα και εγώ πολύ σωστά στην αρχή με το event αφού απ'ότι κατάλαβα δεν είναι event, απλά εκ παραδρομής το έγραψα... Στο sdk που χρησιμοποιώ κάνω override κάποιες μεθόδους κι εγώ. Τέλος πάντων εκεί που ξεκινάει η διαδικασία επικοινωνίας χρησιμοποιώ μια μέθοδο που έχω κάνει override, την onAccept. Από το documentation του sdk που χρησιμοποιώ για την onAccept: "A call to this method is generated on an SCP when an SCU calls connect". H connect καλείται από την client εφαρμογή μου. Το θέμα είναι ότι το service μου δεν μπαίνει ποτέ στην onAccept για να ξεκινήσει η όλη διαδικασία.

    Τώρα, Η listen είναι derived δεν ξέρω τι κάνει εσωτερικά πάντως αυτή λειτουργεί επαληθευμένα όπως έγραψα παραπάνω. Πόρτα 104 δοκίμασα και 13000+.

    Τώρα αυτό που είπες για τα events με προβλημάτισε λίγο. Αρκετά πιο κάτω στον κώδικα μου, σε μια κλάση μου έχω βάλει ένα autoreset event και έχω φτιάξει και κάτι μεθόδους που παγώνουν ένα thread μέχρι να ολοκληρωθεί ένα άλλο και για να γίνει αυτό κάνουν trigger ένα event που επίσης έχω φτιάξει. Αυτό το πράμα δηλαδή δεν θα λειτουργήσει μέσα σε windows service?
  •  03-09-2009, 16:48 53460 σε απάντηση της 53459

    Απ: Windows Service event handling(?)

    Τα δικάσου events θα λειτουργησουν κανονικά. Απλά το Service σαν Service δεν σου δίνει "Events".
    Προτείνω να ελέγξεις αν :

    1ον: Το service ξεκινάει κανονικά και δεν πέφτει μετά απο λίγο ή οταν κάνεις connect.

    2ον: Κάνει όντως connect ο client, μήπως για κάποιο λόγο το αντικειμενό σου (Server) γίνετε dispose μετά απο λίγο?
    Βάλτο εξαίρεση στον Garbage Collector.

    3ον: Προσπάθησε να καλέσεις στην OnStart του service την δικιά σου OnAccept να δείς αν σου φέρνει
    το αποτέλεσμα που θέλεις, και ότι δεν ειναι πρόβλημα του κώδικα και του service,
    αλλά της επικοινωνίας, ώστε να περιορίσεις το εύρος του debugging που έχεις βρεθεί τωρα.

    Δεν μου έρχετε κάτι άλλο με αυτά που λέμε ως τώρα.

  •  03-09-2009, 17:07 53461 σε απάντηση της 53460

    Απ: Windows Service event handling(?)

    Ευχαριστώ για την μέχρι τώρα βοήθεια.

    1ον) Το έχω ελέγξει, θα καταγραφόταν ούτως ή άλλως στα logs μου ή στον event viewer που το έχω κοιτάξει.

    2ον) Δεν γίνεται dispose γιατί αν γινόταν τότε όταν θα έτρεχα την windows forms εφαρμογή δεν θα μου πετούσε το exception "network address is in use". Αυτό σημαίνει ότι ο server μου "ακούει".

    3ον) Ανεξαρτήτως αποτελέσματος η OnAccept καταγράφει κάποια στοιχεία σε log file. Για να μην γράφει σε κάποιο log τότε δεν μπαίνει στην onAccept. Έχω φτιάξει τα  permissions για να γράψω στο φακέλο που κρατάω τα logs από το service και το έχω δοκιμάσει ότι γράφει σε περίπτωση που σκεφτείς ότι δεν το έχω κάνει γι αυτό δεν καταγράφονται τα logs :p

    Γενικά δεν είναι πρόβλημα του κώδικα γιατί όλη η εφαρμογή έχει δοκιμαστεί όσο ήταν σε windows form μορφή. Έκανα copy paste τις κλάσεις μου και ότι κώδικα είχα στην form load τον έβαλα στην onStart. Κάθε πρόταση ευπρόσδεκτη γιατί δεν έχω και προηγούμενη εμπειρία με services και δεν ξέρω τι μπορεί να φταίει.
  •  15-09-2009, 14:44 53741 σε απάντηση της 53461

    Απ: Windows Service event handling(?)

    Βρήκα τι έφταιγε και απλά το παραθέτω σε περίπτωση που κάποιος έχει το συγκεκριμένο πρόβλημα στο μέλλον. Το κυρίως thread ενός windows service δεν έχει message pump και δεν δημιουργούνται events. Οπότε στην onStart έτρεξα την Server.Listen() μέσα σε ενα καινούριο thread και έτσι άρχισε να λειτουργεί ο server μου. (Βέβαια προέκυψαν άλλα προβλήματα αλλά το ψάχνω :p)
  •  15-09-2009, 14:57 53742 σε απάντηση της 53741

    Απ: Windows Service event handling(?)

    Ωραίος, για ότι άλλο πρόβλημα άνοιξε καινούριο θέμα και το συζηταμε ;)

     


Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems